{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "d64f447e-2c96-432e-a6b6-6e11cba52d94",
   "metadata": {},
   "source": [
    "# PCA\n",
    "\n",
    "- work/machine-learning/notebooks/PCA/PCA_Data_Visualization_Iris_Dataset_Blog.ipynb\n",
    "- work/machine-learning/notebooks/PCA/PCA_iris.ipynb\n",
    "- work/machine-learning/notebooks/PCA/PCA-简单例子-checkpoint.ipynb\n",
    "- https://blog.csdn.net/wzyaiwl/article/details/90549391\n",
    "- https://blog.csdn.net/MoreAction_/article/details/107463336"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6855dcdf-756f-4923-82eb-dd5d33d2fc76",
   "metadata": {},
   "source": [
    "## 鸢尾花 标准化"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1f4cc191-8396-43eb-9a1e-b8291bcbdda8",
   "metadata": {},
   "source": [
    "## Standardize the Data\n",
    "\n",
    "- 由于 PCA 产生的特征子空间能使沿坐标轴的方差最大化，因此对数据进行标准化是有意义的，尤其是在数据是以不同尺度测量的情况下。虽然虹膜数据集中的所有特征都是以厘米为单位测量的，但让我们继续将数据转换为单位尺度（均值=0，方差=1），这是许多机器学习算法达到最佳性能的要求。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "f10224d5-5af9-4a8c-aac4-2180f1332d76",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd \n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.decomposition import PCA\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d9c8d3ca-245a-42b5-a362-c7f4ce13da9c",
   "metadata": {},
   "source": [
    "### 法一 自己实现数据的标准化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "9ee92240-0aa8-4b79-84ce-9b5b26567cac",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>sepal length (cm)</th>\n",
       "      <th>sepal width (cm)</th>\n",
       "      <th>petal length (cm)</th>\n",
       "      <th>petal width (cm)</th>\n",
       "      <th>target</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>5.1</td>\n",
       "      <td>3.5</td>\n",
       "      <td>1.4</td>\n",
       "      <td>0.2</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>4.9</td>\n",
       "      <td>3.0</td>\n",
       "      <td>1.4</td>\n",
       "      <td>0.2</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>4.7</td>\n",
       "      <td>3.2</td>\n",
       "      <td>1.3</td>\n",
       "      <td>0.2</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4.6</td>\n",
       "      <td>3.1</td>\n",
       "      <td>1.5</td>\n",
       "      <td>0.2</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5.0</td>\n",
       "      <td>3.6</td>\n",
       "      <td>1.4</td>\n",
       "      <td>0.2</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>145</th>\n",
       "      <td>6.7</td>\n",
       "      <td>3.0</td>\n",
       "      <td>5.2</td>\n",
       "      <td>2.3</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>146</th>\n",
       "      <td>6.3</td>\n",
       "      <td>2.5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>1.9</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>147</th>\n",
       "      <td>6.5</td>\n",
       "      <td>3.0</td>\n",
       "      <td>5.2</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>148</th>\n",
       "      <td>6.2</td>\n",
       "      <td>3.4</td>\n",
       "      <td>5.4</td>\n",
       "      <td>2.3</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>149</th>\n",
       "      <td>5.9</td>\n",
       "      <td>3.0</td>\n",
       "      <td>5.1</td>\n",
       "      <td>1.8</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>150 rows × 5 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "     sepal length (cm)  sepal width (cm)  petal length (cm)  petal width (cm)  \\\n",
       "0                  5.1               3.5                1.4               0.2   \n",
       "1                  4.9               3.0                1.4               0.2   \n",
       "2                  4.7               3.2                1.3               0.2   \n",
       "3                  4.6               3.1                1.5               0.2   \n",
       "4                  5.0               3.6                1.4               0.2   \n",
       "..                 ...               ...                ...               ...   \n",
       "145                6.7               3.0                5.2               2.3   \n",
       "146                6.3               2.5                5.0               1.9   \n",
       "147                6.5               3.0                5.2               2.0   \n",
       "148                6.2               3.4                5.4               2.3   \n",
       "149                5.9               3.0                5.1               1.8   \n",
       "\n",
       "     target  \n",
       "0         0  \n",
       "1         0  \n",
       "2         0  \n",
       "3         0  \n",
       "4         0  \n",
       "..      ...  \n",
       "145       2  \n",
       "146       2  \n",
       "147       2  \n",
       "148       2  \n",
       "149       2  \n",
       "\n",
       "[150 rows x 5 columns]"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn import datasets\n",
    "import pandas as pd\n",
    "# 导入sklearn自带的iris数据集\n",
    "iris = datasets.load_iris()\n",
    "df = pd.DataFrame(iris.data, columns=iris.feature_names)\n",
    "df['target']= pd.DataFrame(iris.target)\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "1b2e3e4a-b704-4dda-9d1a-f6e3226a631d",
   "metadata": {},
   "outputs": [],
   "source": [
    "dat = iris['data'][0,:]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "a8681a2a-62e5-44ff-82e7-9a13bd0f2d7f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "5.551115123125783e-17"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mean = dat.mean()\n",
    "mean"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "93c53f73-ee15-43fa-930e-b9cbf3b38343",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1.0"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "std = dat.std()\n",
    "std"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "286a402c-5e05-41a1-9bce-bb44c01a4bf4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 1.351023  ,  0.5033223 , -0.60928488, -1.24506042])"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dat =(dat-mean)/std\n",
    "dat"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "85fefa05-0a0f-4533-8d13-59ce920ba8e5",
   "metadata": {},
   "source": [
    "### 法二 sklearn提供的StandardScaler方法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "03b025d2-a247-4415-85af-40c41da542e6",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>sepal length</th>\n",
       "      <th>sepal width</th>\n",
       "      <th>petal length</th>\n",
       "      <th>petal width</th>\n",
       "      <th>target</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>5.1</td>\n",
       "      <td>3.5</td>\n",
       "      <td>1.4</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>4.9</td>\n",
       "      <td>3.0</td>\n",
       "      <td>1.4</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>4.7</td>\n",
       "      <td>3.2</td>\n",
       "      <td>1.3</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4.6</td>\n",
       "      <td>3.1</td>\n",
       "      <td>1.5</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5.0</td>\n",
       "      <td>3.6</td>\n",
       "      <td>1.4</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   sepal length  sepal width  petal length  petal width       target\n",
       "0           5.1          3.5           1.4          0.2  Iris-setosa\n",
       "1           4.9          3.0           1.4          0.2  Iris-setosa\n",
       "2           4.7          3.2           1.3          0.2  Iris-setosa\n",
       "3           4.6          3.1           1.5          0.2  Iris-setosa\n",
       "4           5.0          3.6           1.4          0.2  Iris-setosa"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "## 从网上导入鸢尾花数据\n",
    "url = \"https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data\"\n",
    "\n",
    "# loading dataset into Pandas DataFrame\n",
    "df = pd.read_csv(url\n",
    "                 , names=['sepal length','sepal width','petal length','petal width','target'])\n",
    "\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "1d0bb526-cb10-478e-a8eb-6a939c55a863",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>sepal length</th>\n",
       "      <th>sepal width</th>\n",
       "      <th>petal length</th>\n",
       "      <th>petal width</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>-0.900681</td>\n",
       "      <td>1.032057</td>\n",
       "      <td>-1.341272</td>\n",
       "      <td>-1.312977</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-1.143017</td>\n",
       "      <td>-0.124958</td>\n",
       "      <td>-1.341272</td>\n",
       "      <td>-1.312977</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-1.385353</td>\n",
       "      <td>0.337848</td>\n",
       "      <td>-1.398138</td>\n",
       "      <td>-1.312977</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-1.506521</td>\n",
       "      <td>0.106445</td>\n",
       "      <td>-1.284407</td>\n",
       "      <td>-1.312977</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-1.021849</td>\n",
       "      <td>1.263460</td>\n",
       "      <td>-1.341272</td>\n",
       "      <td>-1.312977</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   sepal length  sepal width  petal length  petal width\n",
       "0     -0.900681     1.032057     -1.341272    -1.312977\n",
       "1     -1.143017    -0.124958     -1.341272    -1.312977\n",
       "2     -1.385353     0.337848     -1.398138    -1.312977\n",
       "3     -1.506521     0.106445     -1.284407    -1.312977\n",
       "4     -1.021849     1.263460     -1.341272    -1.312977"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#定义列表features包含四个特征名称，这些特征通常用于鸢尾花数据集。\n",
    "features = ['sepal length', 'sepal width', 'petal length', 'petal width']  \n",
    "\n",
    "#从DataFrame df中选取features列表中的特征，并将结果赋值给变量x。df.loc[:, features]表示选择所有行（:）和features列表中指定的列。\n",
    "#values将DataFrame中的数据转换为NumPy数组。\n",
    "x = df.loc[:, features].values\n",
    "\n",
    "#从DataFrame df中选取名为'target'的列，这通常是目标变量或标签，并将结果赋值给变量y。\n",
    "#同样使用.values将结果转换为NumPy数组。\n",
    "y = df.loc[:,['target']].values\n",
    "\n",
    "#使用StandardScaler对特征x进行标准化（也称为Z-score标准化）。\n",
    "#fit_transform方法首先计算训练数据的均值和标准差，然后使用这些参数将数据转换为均值为0，标准差为1的标准正态分布。\n",
    "x = StandardScaler().fit_transform(x)\n",
    "\n",
    "# 将标准化后的NumPy数组x转换回DataFrame，并指定列名为features列表中的名称。\n",
    "# head()函数显示DataFrame的前5行，这是一个很好的快速检查数据是否正确处理的方法。\n",
    "pd.DataFrame(data = x, columns = features).head()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "523e2172-be7f-441a-ab47-ec9e2fc7504b",
   "metadata": {},
   "source": [
    "## PCA Projection to 2D"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "id": "f6d470e5-2b29-47a0-92ba-a89c625266ce",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>principal component 1</th>\n",
       "      <th>principal component 2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>-2.264542</td>\n",
       "      <td>0.505704</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-2.086426</td>\n",
       "      <td>-0.655405</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-2.367950</td>\n",
       "      <td>-0.318477</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-2.304197</td>\n",
       "      <td>-0.575368</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-2.388777</td>\n",
       "      <td>0.674767</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>145</th>\n",
       "      <td>1.870522</td>\n",
       "      <td>0.382822</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>146</th>\n",
       "      <td>1.558492</td>\n",
       "      <td>-0.905314</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>147</th>\n",
       "      <td>1.520845</td>\n",
       "      <td>0.266795</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>148</th>\n",
       "      <td>1.376391</td>\n",
       "      <td>1.016362</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>149</th>\n",
       "      <td>0.959299</td>\n",
       "      <td>-0.022284</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>150 rows × 2 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "     principal component 1  principal component 2\n",
       "0                -2.264542               0.505704\n",
       "1                -2.086426              -0.655405\n",
       "2                -2.367950              -0.318477\n",
       "3                -2.304197              -0.575368\n",
       "4                -2.388777               0.674767\n",
       "..                     ...                    ...\n",
       "145               1.870522               0.382822\n",
       "146               1.558492              -0.905314\n",
       "147               1.520845               0.266795\n",
       "148               1.376391               1.016362\n",
       "149               0.959299              -0.022284\n",
       "\n",
       "[150 rows x 2 columns]"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#创建了一个PCA对象，n_components=2参数指定了降维后保留的主成分数量，这里是2个。\n",
    "pca = PCA(n_components=2)\n",
    "\n",
    "#对特征数据x进行PCA降维。fit_transform方法首先拟合PCA模型（计算协方差矩阵、特征值和特征向量）\n",
    "#然后将数据转换到由这两个主成分构成的新空间中。\n",
    "principalComponents = pca.fit_transform(x)\n",
    "\n",
    "#将PCA降维后得到的主成分数据principalComponents转换成一个新的DataFrame，列名分别设为'principal component 1'和'principal component 2'。\n",
    "principalDf = pd.DataFrame(data = principalComponents\n",
    "             , columns = ['principal component 1', 'principal component 2'])\n",
    "\n",
    "#显示新DataFrame\n",
    "principalDf"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "id": "7181e82e-de0a-48bd-9a6a-483ffbf32b18",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>target</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        target\n",
       "0  Iris-setosa\n",
       "1  Iris-setosa\n",
       "2  Iris-setosa\n",
       "3  Iris-setosa\n",
       "4  Iris-setosa"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[['target']].head() #使用Python的pandas库来查看DataFrame df 中名为 'target' 的列的前5行数据的示例代码"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "id": "1466ec65-9bf8-4072-9428-d71c9a57c9fb",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>principal component 1</th>\n",
       "      <th>principal component 2</th>\n",
       "      <th>target</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>-2.264542</td>\n",
       "      <td>0.505704</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-2.086426</td>\n",
       "      <td>-0.655405</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-2.367950</td>\n",
       "      <td>-0.318477</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-2.304197</td>\n",
       "      <td>-0.575368</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-2.388777</td>\n",
       "      <td>0.674767</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   principal component 1  principal component 2       target\n",
       "0              -2.264542               0.505704  Iris-setosa\n",
       "1              -2.086426              -0.655405  Iris-setosa\n",
       "2              -2.367950              -0.318477  Iris-setosa\n",
       "3              -2.304197              -0.575368  Iris-setosa\n",
       "4              -2.388777               0.674767  Iris-setosa"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#pd.concat() 是pandas库中的一个函数，用于合并两个或多个pandas对象\n",
    "#参数 axis=1 指定了合并的方向:axis=0 表示沿着行方向（垂直方向）合并，而 axis=1 表示沿着列方向（水平方向）合并。\n",
    "finalDf = pd.concat([principalDf, df[['target']]], axis = 1) #使用Python的pandas库将两个DataFrame沿着列方向（水平方向）合并\n",
    "finalDf.head(5)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b688e83f-b52e-4574-b4ad-fa4ca824d8ce",
   "metadata": {},
   "source": [
    "## 课堂作业\n",
    "\n",
    "# 基于iris数据 建立KNN模型实现数据分类\n",
    "对数据进行标准环处理,选择一个维度可视化处理后效果\n",
    "\n",
    "进行与元数据等维度PCA,查看各主成分的方差比例\n",
    "\n",
    "保留合适的主成分,可视化降维后的数据\n",
    "\n",
    "基于降维后数据建立KNN模型,与元数据表现进行对比"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 210,
   "id": "cc4ad1e1-793f-401c-8ec1-f8a5fb21644d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "   Unnamed: 0  Sepal.Length  Sepal.Width  Petal.Length  Petal.Width Species\n",
      "0           1           5.1          3.5           1.4          0.2  setosa\n",
      "1           2           4.9          3.0           1.4          0.2  setosa\n",
      "2           3           4.7          3.2           1.3          0.2  setosa\n",
      "3           4           4.6          3.1           1.5          0.2  setosa\n",
      "4           5           5.0          3.6           1.4          0.2  setosa\n"
     ]
    }
   ],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "from sklearn.model_selection import train_test_split\n",
    "data = pd.read_csv('D:/work/machine-learning/notebooks/PCA/iris.csv')\n",
    "print(data.head())"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b7d6f31a-70db-47ed-97f1-ed6e78a4b69f",
   "metadata": {},
   "source": [
    "### 检查数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 211,
   "id": "b896e072-1646-4bb8-85a3-0174441d9c6e",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 151 entries, 0 to 150\n",
      "Data columns (total 6 columns):\n",
      " #   Column  Non-Null Count  Dtype  \n",
      "---  ------  --------------  -----  \n",
      " 0   0       150 non-null    float64\n",
      " 1   1       151 non-null    object \n",
      " 2   2       151 non-null    object \n",
      " 3   3       151 non-null    object \n",
      " 4   4       151 non-null    object \n",
      " 5   5       151 non-null    object \n",
      "dtypes: float64(1), object(5)\n",
      "memory usage: 7.2+ KB\n"
     ]
    }
   ],
   "source": [
    "df.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 212,
   "id": "59fac6c8-b0ea-4909-8b8e-bbdd8240cf13",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>150.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>75.500000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>43.445368</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>38.250000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>75.500000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>112.750000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>150.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                0\n",
       "count  150.000000\n",
       "mean    75.500000\n",
       "std     43.445368\n",
       "min      1.000000\n",
       "25%     38.250000\n",
       "50%     75.500000\n",
       "75%    112.750000\n",
       "max    150.000000"
      ]
     },
     "execution_count": 212,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 通过数据对象的describe()函数进行简单的描述性统计分析--均值，标准差，分位数\n",
    "df.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 213,
   "id": "0eced1b9-4240-463e-a95c-def94e5ea9f6",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    1\n",
       "1    0\n",
       "2    0\n",
       "3    0\n",
       "4    0\n",
       "5    0\n",
       "dtype: int64"
      ]
     },
     "execution_count": 213,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.isnull().sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 214,
   "id": "9030e01d-5358-4c85-85c8-41e6c427b65f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0      False\n",
       "1      False\n",
       "2      False\n",
       "3      False\n",
       "4      False\n",
       "       ...  \n",
       "146    False\n",
       "147    False\n",
       "148    False\n",
       "149    False\n",
       "150    False\n",
       "Length: 151, dtype: bool"
      ]
     },
     "execution_count": 214,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.duplicated()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7dd0f7d3-320b-4210-8259-d24047f7e422",
   "metadata": {},
   "source": [
    "### 开始"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 219,
   "id": "86cb41f0-bd00-4b08-9966-cc96d7579751",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn import tree\n",
    "from sklearn.tree import DecisionTreeClassifier\n",
    "from sklearn.ensemble import RandomForestClassifier\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.metrics import classification_report\n",
    "from sklearn.metrics import confusion_matrix\n",
    "from sklearn.metrics import roc_curve\n",
    "from sklearn.metrics import auc"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 220,
   "id": "db61fbcb-cbc3-40c4-b251-44f6e8302703",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>principal component 1</th>\n",
       "      <th>principal component 2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>-2.264542</td>\n",
       "      <td>0.505704</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-2.086426</td>\n",
       "      <td>-0.655405</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-2.367950</td>\n",
       "      <td>-0.318477</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-2.304197</td>\n",
       "      <td>-0.575368</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-2.388777</td>\n",
       "      <td>0.674767</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>145</th>\n",
       "      <td>1.870522</td>\n",
       "      <td>0.382822</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>146</th>\n",
       "      <td>1.558492</td>\n",
       "      <td>-0.905314</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>147</th>\n",
       "      <td>1.520845</td>\n",
       "      <td>0.266795</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>148</th>\n",
       "      <td>1.376391</td>\n",
       "      <td>1.016362</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>149</th>\n",
       "      <td>0.959299</td>\n",
       "      <td>-0.022284</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>150 rows × 2 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "     principal component 1  principal component 2\n",
       "0                -2.264542               0.505704\n",
       "1                -2.086426              -0.655405\n",
       "2                -2.367950              -0.318477\n",
       "3                -2.304197              -0.575368\n",
       "4                -2.388777               0.674767\n",
       "..                     ...                    ...\n",
       "145               1.870522               0.382822\n",
       "146               1.558492              -0.905314\n",
       "147               1.520845               0.266795\n",
       "148               1.376391               1.016362\n",
       "149               0.959299              -0.022284\n",
       "\n",
       "[150 rows x 2 columns]"
      ]
     },
     "execution_count": 220,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pca = PCA(n_components=2)    #成员的数量————用两个维度的信息代表四个维度的信息，是浓缩和精华\n",
    "principalComponents = pca.fit_transform(x)    #主要的成分\n",
    "principalDf = pd.DataFrame(data = principalComponents\n",
    "             , columns = ['principal component 1', 'principal component 2'])\n",
    "principalDf"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 242,
   "id": "53f8937c-8fc7-4636-a313-d5893727c1e9",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(105, 2) (45, 2)\n"
     ]
    }
   ],
   "source": [
    "trainData_X = principalDf\n",
    "trainData_y = iris['target']\n",
    "from sklearn.model_selection import train_test_split\n",
    "X_train, X_test, y_train, y_test = train_test_split(trainData_X, trainData_y, test_size=0.3, random_state=615)\n",
    "print(X_train.shape,X_test.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 243,
   "id": "02021fbb-7e4d-4673-b775-8f8d38ee3782",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-45 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: black;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-45 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-45 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-45 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-45 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-45 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-45 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-45 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-45 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-45 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-45 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-45 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-45 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-45 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-45 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-45 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "#sk-container-id-45 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-45 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-45 div.sk-toggleable__content {\n",
       "  max-height: 0;\n",
       "  max-width: 0;\n",
       "  overflow: hidden;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-45 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-45 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-45 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-45 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  max-height: 200px;\n",
       "  max-width: 100%;\n",
       "  overflow: auto;\n",
       "}\n",
       "\n",
       "#sk-container-id-45 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-45 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-45 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-45 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-45 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-45 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-45 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-45 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-45 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-45 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-45 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-45 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-45 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-45 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-45 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 1ex;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-45 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-45 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-45 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-45 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "</style><div id=\"sk-container-id-45\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>RandomForestClassifier(n_estimators=5)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-55\" type=\"checkbox\" checked><label for=\"sk-estimator-id-55\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;&nbsp;RandomForestClassifier<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.ensemble.RandomForestClassifier.html\">?<span>Documentation for RandomForestClassifier</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>RandomForestClassifier(n_estimators=5)</pre></div> </div></div></div></div>"
      ],
      "text/plain": [
       "RandomForestClassifier(n_estimators=5)"
      ]
     },
     "execution_count": 243,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rf = RandomForestClassifier(n_estimators = 5)\n",
    "rf.fit(X_train, y_train.ravel())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 244,
   "id": "fc505ce9-28e0-421d-9d45-2020eb0084e2",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       1.00      1.00      1.00        10\n",
      "           1       0.95      0.95      0.95        19\n",
      "           2       0.94      0.94      0.94        16\n",
      "\n",
      "    accuracy                           0.96        45\n",
      "   macro avg       0.96      0.96      0.96        45\n",
      "weighted avg       0.96      0.96      0.96        45\n",
      "\n",
      "[[10  0  0]\n",
      " [ 0 18  1]\n",
      " [ 0  1 15]]\n"
     ]
    }
   ],
   "source": [
    "# 利用模型对测试集进行预测，输出target预测标签值和概率\n",
    "y_test_pred = rf.predict(X_test)\n",
    "y_test_prob = rf.predict_proba(X_test)\n",
    "\n",
    "# 分类评估汇总报告classification_report\n",
    "print(classification_report(y_test,y_test_pred))\n",
    "\n",
    "# 误分类矩阵 confusion_matrix\n",
    "print(confusion_matrix(y_test,y_test_pred))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "872f5234-bd65-4df3-92af-f3e4bd923b64",
   "metadata": {},
   "source": [
    "## 课堂作业2 (天文的光谱数据)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 146,
   "id": "9e01c975-f119-467f-9736-6a9af9459f19",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Reading in LAMOST data...\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "print(\"Reading in LAMOST data...\")\n",
    "X = np.load('D:/work/homework/天文光谱数据/data/fluxs.npy')\n",
    "y = np.load('D:/work/homework/天文光谱数据/data/sclss.npy')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 185,
   "id": "aeefc656-925b-43f9-9ba6-2bba0c028fbe",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "from sklearn import tree\n",
    "from sklearn.tree import DecisionTreeClassifier\n",
    "from sklearn.ensemble import RandomForestClassifier\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.metrics import classification_report\n",
    "from sklearn.metrics import confusion_matrix\n",
    "from sklearn.metrics import roc_curve\n",
    "from sklearn.metrics import auc\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.decomposition import PCA\n",
    "from sklearn.preprocessing import StandardScaler"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 147,
   "id": "3c203339-f88d-47f8-b951-1f282b91ff93",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(700, 3700)"
      ]
     },
     "execution_count": 147,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 148,
   "id": "fdeaa0cd-151b-4eed-ac1a-2a8d4d3f7058",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array(['B', 'F', 'F', 'A', 'G', 'K', 'O', 'B', 'M', 'O', 'G', 'M', 'F',\n",
       "       'K', 'G', 'F', 'F', 'O', 'B', 'G', 'F', 'G', 'B', 'O', 'A', 'K',\n",
       "       'M', 'A', 'F', 'F', 'F', 'G', 'F', 'A', 'K', 'G', 'A', 'G', 'K',\n",
       "       'K', 'K', 'A', 'K', 'G', 'G', 'F', 'A', 'M', 'B', 'F', 'K', 'B',\n",
       "       'G', 'F', 'F', 'O', 'O', 'M', 'F', 'A', 'O', 'G', 'O', 'O', 'K',\n",
       "       'F', 'G', 'A', 'A', 'B', 'G', 'F', 'G', 'F', 'M', 'K', 'A', 'B',\n",
       "       'B', 'G', 'K', 'K', 'M', 'M', 'A', 'G', 'K', 'M', 'B', 'K', 'G',\n",
       "       'G', 'B', 'O', 'B', 'B', 'O', 'F', 'G', 'B', 'O', 'K', 'O', 'G',\n",
       "       'K', 'B', 'O', 'G', 'A', 'K', 'M', 'F', 'A', 'F', 'F', 'A', 'M',\n",
       "       'B', 'A', 'O', 'O', 'F', 'K', 'A', 'O', 'K', 'M', 'A', 'M', 'G',\n",
       "       'O', 'K', 'A', 'M', 'K', 'O', 'F', 'B', 'F', 'B', 'M', 'O', 'O',\n",
       "       'K', 'O', 'M', 'K', 'A', 'M', 'O', 'G', 'O', 'B', 'O', 'A', 'K',\n",
       "       'G', 'B', 'K', 'F', 'A', 'M', 'B', 'M', 'G', 'G', 'O', 'F', 'O',\n",
       "       'B', 'O', 'K', 'M', 'A', 'O', 'F', 'M', 'A', 'G', 'O', 'A', 'K',\n",
       "       'F', 'M', 'O', 'F', 'F', 'F', 'K', 'G', 'O', 'O', 'O', 'F', 'K',\n",
       "       'B', 'F', 'G', 'M', 'F', 'M', 'B', 'A', 'A', 'G', 'F', 'M', 'B',\n",
       "       'B', 'A', 'G', 'K', 'O', 'F', 'M', 'O', 'G', 'O', 'A', 'F', 'M',\n",
       "       'M', 'O', 'B', 'B', 'B', 'A', 'A', 'K', 'K', 'B', 'F', 'F', 'F',\n",
       "       'F', 'G', 'M', 'B', 'O', 'M', 'M', 'G', 'G', 'F', 'A', 'K', 'G',\n",
       "       'B', 'A', 'O', 'O', 'G', 'A', 'F', 'B', 'M', 'A', 'B', 'G', 'F',\n",
       "       'A', 'G', 'K', 'G', 'A', 'A', 'M', 'B', 'A', 'K', 'K', 'B', 'K',\n",
       "       'O', 'A', 'F', 'A', 'M', 'O', 'A', 'G', 'M', 'G', 'F', 'M', 'K',\n",
       "       'B', 'F', 'K', 'B', 'G', 'A', 'A', 'F', 'A', 'B', 'A', 'G', 'G',\n",
       "       'A', 'A', 'A', 'O', 'F', 'M', 'B', 'F', 'F', 'M', 'M', 'G', 'K',\n",
       "       'K', 'F', 'B', 'A', 'G', 'B', 'B', 'M', 'A', 'K', 'B', 'M', 'G',\n",
       "       'K', 'B', 'O', 'A', 'F', 'F', 'M', 'F', 'G', 'G', 'K', 'G', 'M',\n",
       "       'M', 'K', 'G', 'A', 'F', 'K', 'B', 'B', 'G', 'G', 'G', 'B', 'A',\n",
       "       'M', 'M', 'F', 'O', 'K', 'A', 'G', 'K', 'K', 'B', 'M', 'B', 'M',\n",
       "       'A', 'F', 'G', 'F', 'B', 'K', 'B', 'K', 'O', 'F', 'O', 'G', 'A',\n",
       "       'A', 'K', 'K', 'B', 'B', 'K', 'O', 'G', 'O', 'M', 'A', 'F', 'O',\n",
       "       'A', 'K', 'M', 'M', 'A', 'G', 'F', 'A', 'G', 'M', 'K', 'B', 'O',\n",
       "       'A', 'B', 'K', 'O', 'B', 'K', 'G', 'F', 'F', 'F', 'G', 'M', 'G',\n",
       "       'F', 'O', 'B', 'O', 'K', 'K', 'G', 'O', 'A', 'K', 'O', 'G', 'G',\n",
       "       'G', 'M', 'K', 'M', 'B', 'G', 'F', 'K', 'K', 'M', 'B', 'O', 'B',\n",
       "       'A', 'O', 'F', 'F', 'A', 'G', 'O', 'O', 'B', 'O', 'K', 'A', 'F',\n",
       "       'O', 'F', 'F', 'A', 'K', 'F', 'K', 'G', 'B', 'F', 'O', 'B', 'G',\n",
       "       'F', 'G', 'O', 'G', 'G', 'M', 'F', 'A', 'O', 'M', 'B', 'G', 'M',\n",
       "       'B', 'M', 'F', 'B', 'A', 'A', 'F', 'K', 'K', 'K', 'A', 'B', 'K',\n",
       "       'F', 'F', 'B', 'O', 'B', 'K', 'M', 'K', 'K', 'K', 'O', 'M', 'O',\n",
       "       'B', 'A', 'B', 'A', 'B', 'G', 'B', 'M', 'M', 'G', 'K', 'F', 'G',\n",
       "       'O', 'F', 'K', 'A', 'B', 'G', 'B', 'O', 'F', 'G', 'O', 'K', 'K',\n",
       "       'O', 'K', 'F', 'B', 'F', 'M', 'K', 'M', 'A', 'G', 'A', 'O', 'B',\n",
       "       'B', 'B', 'A', 'F', 'K', 'O', 'B', 'A', 'A', 'M', 'M', 'A', 'B',\n",
       "       'G', 'B', 'M', 'O', 'K', 'K', 'O', 'A', 'G', 'M', 'G', 'O', 'B',\n",
       "       'M', 'M', 'O', 'G', 'A', 'M', 'O', 'B', 'K', 'M', 'O', 'O', 'G',\n",
       "       'A', 'A', 'B', 'M', 'A', 'G', 'M', 'B', 'G', 'K', 'B', 'M', 'M',\n",
       "       'M', 'M', 'K', 'F', 'A', 'A', 'O', 'O', 'F', 'A', 'K', 'K', 'B',\n",
       "       'F', 'K', 'K', 'M', 'M', 'A', 'B', 'M', 'O', 'F', 'M', 'M', 'A',\n",
       "       'O', 'A', 'M', 'F', 'O', 'B', 'B', 'A', 'O', 'O', 'M', 'A', 'G',\n",
       "       'O', 'O', 'K', 'M', 'M', 'O', 'B', 'O', 'G', 'K', 'M', 'M', 'B',\n",
       "       'G', 'O', 'K', 'A', 'A', 'O', 'K', 'M', 'F', 'B', 'K', 'O', 'F',\n",
       "       'M', 'O', 'G', 'G', 'G', 'M', 'M', 'F', 'O', 'A', 'M', 'G', 'B',\n",
       "       'M', 'G', 'F', 'O', 'A', 'F', 'M', 'K', 'B', 'A', 'O', 'B', 'B',\n",
       "       'G', 'F', 'M', 'K', 'K', 'B', 'M', 'A', 'F', 'G', 'F'], dtype='<U1')"
      ]
     },
     "execution_count": 148,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 149,
   "id": "dc89e7fe-f9a6-419f-b678-4f124de33497",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x1c1abdf9cd0>]"
      ]
     },
     "execution_count": 149,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x1c1abdfbc50>]"
      ]
     },
     "execution_count": 149,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "plt.plot(X[0])\n",
    "plt.plot(X[1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 168,
   "id": "47834165-94df-43bb-9f46-b5d844a9157b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(490, 3700) (210, 3700)\n"
     ]
    }
   ],
   "source": [
    "trainData_X = X\n",
    "trainData_y = y\n",
    "\n",
    "from sklearn.model_selection import train_test_split\n",
    "X_train, X_test, y_train, y_test = train_test_split(trainData_X, trainData_y, test_size=0.3, random_state=1000)\n",
    "print(X_train.shape,X_test.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 169,
   "id": "be15be43-ddc0-4ab4-9a70-8ba4b582774c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-16 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: black;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-16 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-16 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-16 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-16 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-16 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-16 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-16 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-16 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-16 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-16 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-16 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-16 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-16 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-16 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-16 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "#sk-container-id-16 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-16 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-16 div.sk-toggleable__content {\n",
       "  max-height: 0;\n",
       "  max-width: 0;\n",
       "  overflow: hidden;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-16 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-16 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-16 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-16 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  max-height: 200px;\n",
       "  max-width: 100%;\n",
       "  overflow: auto;\n",
       "}\n",
       "\n",
       "#sk-container-id-16 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-16 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-16 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-16 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-16 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-16 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-16 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-16 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-16 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-16 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-16 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-16 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-16 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-16 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-16 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 1ex;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-16 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-16 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-16 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-16 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "</style><div id=\"sk-container-id-16\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>RandomForestClassifier()</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-18\" type=\"checkbox\" checked><label for=\"sk-estimator-id-18\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;&nbsp;RandomForestClassifier<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.ensemble.RandomForestClassifier.html\">?<span>Documentation for RandomForestClassifier</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>RandomForestClassifier()</pre></div> </div></div></div></div>"
      ],
      "text/plain": [
       "RandomForestClassifier()"
      ]
     },
     "execution_count": 169,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rf = RandomForestClassifier()\n",
    "rf.fit(X_train, y_train.ravel())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 170,
   "id": "a5c9eb68-4047-46bd-981c-e9977ed7118b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "              precision    recall  f1-score   support\n",
      "\n",
      "           A       1.00      0.84      0.91        37\n",
      "           B       0.85      0.79      0.81        28\n",
      "           F       0.69      0.74      0.71        27\n",
      "           G       0.90      0.84      0.87        31\n",
      "           K       0.87      0.93      0.90        29\n",
      "           M       1.00      1.00      1.00        24\n",
      "           O       0.80      0.94      0.86        34\n",
      "\n",
      "    accuracy                           0.87       210\n",
      "   macro avg       0.87      0.87      0.87       210\n",
      "weighted avg       0.87      0.87      0.87       210\n",
      "\n",
      "[[31  0  3  0  1  0  2]\n",
      " [ 0 22  3  0  0  0  3]\n",
      " [ 0  2 20  2  1  0  2]\n",
      " [ 0  1  2 26  2  0  0]\n",
      " [ 0  0  0  1 27  0  1]\n",
      " [ 0  0  0  0  0 24  0]\n",
      " [ 0  1  1  0  0  0 32]]\n"
     ]
    }
   ],
   "source": [
    "# 利用模型对测试集进行预测，输出target预测标签值和概率\n",
    "y_test_pred = rf.predict(X_test)\n",
    "y_test_prob = rf.predict_proba(X_test)\n",
    "\n",
    "# 分类评估汇总报告classification_report\n",
    "print(classification_report(y_test,y_test_pred))\n",
    "\n",
    "# 误分类矩阵 confusion_matrix\n",
    "print(confusion_matrix(y_test,y_test_pred))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0755c52f-84f5-4ea3-90dd-91e6d290ac5a",
   "metadata": {},
   "source": [
    "## 课后作业\n",
    "- 请自学PCA_iris [26]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 258,
   "id": "b95b025c-cdac-44d6-896f-099e7237f33f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Axes: >"
      ]
     },
     "execution_count": 258,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": [
       "<Axes: >"
      ]
     },
     "execution_count": 258,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": [
       "(array([ 1.,  0.,  3.,  0.,  0.,  1.,  0.,  0.,  4.,  0.,  0.,  2.,  0.,\n",
       "         5.,  0.,  0.,  6.,  0.,  0., 10.,  0.,  0.,  9.,  0.,  0.,  4.,\n",
       "         0.,  1.,  0.,  0.,  6.,  0.,  0.,  7.,  0.,  0.,  6.,  0.,  8.,\n",
       "         0.,  0.,  7.,  0.,  0.,  3.,  0.,  0.,  6.,  0.,  6.,  0.,  0.,\n",
       "         4.,  0.,  0.,  9.,  0.,  0.,  7.,  0.,  0.,  5.,  0.,  2.,  0.,\n",
       "         0.,  8.,  0.,  0.,  3.,  0.,  0.,  4.,  0.,  0.,  1.,  0.,  1.,\n",
       "         0.,  0.,  3.,  0.,  0.,  1.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,\n",
       "         1.,  0.,  0.,  4.,  0.,  0.,  0.,  0.,  1.]),\n",
       " array([-1.87002413, -1.8264037 , -1.78278327, -1.73916283, -1.6955424 ,\n",
       "        -1.65192197, -1.60830153, -1.5646811 , -1.52106067, -1.47744023,\n",
       "        -1.4338198 , -1.39019937, -1.34657893, -1.3029585 , -1.25933807,\n",
       "        -1.21571763, -1.1720972 , -1.12847677, -1.08485633, -1.0412359 ,\n",
       "        -0.99761547, -0.95399503, -0.9103746 , -0.86675417, -0.82313373,\n",
       "        -0.7795133 , -0.73589287, -0.69227243, -0.648652  , -0.60503157,\n",
       "        -0.56141113, -0.5177907 , -0.47417027, -0.43054983, -0.3869294 ,\n",
       "        -0.34330897, -0.29968853, -0.2560681 , -0.21244767, -0.16882723,\n",
       "        -0.1252068 , -0.08158637, -0.03796593,  0.0056545 ,  0.04927493,\n",
       "         0.09289537,  0.1365158 ,  0.18013623,  0.22375667,  0.2673771 ,\n",
       "         0.31099753,  0.35461797,  0.3982384 ,  0.44185883,  0.48547927,\n",
       "         0.5290997 ,  0.57272013,  0.61634057,  0.659961  ,  0.70358143,\n",
       "         0.74720187,  0.7908223 ,  0.83444273,  0.87806317,  0.9216836 ,\n",
       "         0.96530403,  1.00892447,  1.0525449 ,  1.09616533,  1.13978577,\n",
       "         1.1834062 ,  1.22702663,  1.27064707,  1.3142675 ,  1.35788793,\n",
       "         1.40150837,  1.4451288 ,  1.48874923,  1.53236967,  1.5759901 ,\n",
       "         1.61961053,  1.66323097,  1.7068514 ,  1.75047184,  1.79409227,\n",
       "         1.8377127 ,  1.88133314,  1.92495357,  1.968574  ,  2.01219444,\n",
       "         2.05581487,  2.0994353 ,  2.14305574,  2.18667617,  2.2302966 ,\n",
       "         2.27391704,  2.31753747,  2.3611579 ,  2.40477834,  2.44839877,\n",
       "         2.4920192 ]),\n",
       " <BarContainer object of 100 artists>)"
      ]
     },
     "execution_count": 258,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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ueCCC+LnP/95PPvssxER8atf/SoeffTRuOSSS446pr6+Pvbt29doA6DzsqIDQJfzta99Lerq6uLss8+O7t27x+HDh+Pmm2+Ov//7vz/qmKqqqliwYEEHVkkKhs55qOHxC7dOyGMlaTPPNMeKDgBdzurVq+Pf//3f47777otf/vKXce+998a3vvWtuPfee486Zu7cuVFXV9ew7dixowMrBiBXVnQA6HKuu+66mDNnTnz+85+PiIi//Mu/jBdffDGqqqri8ssvb3ZMUVFRFBUVdWSZALwDVnQA6HJef/316Nat8SWwe/fuPl4aICFWdADociZOnBg333xznHHGGfH+978/amtrY+HChXHllVfmuzQA2oigA0CXc8cdd8T/+3//L6ZPnx67d++OgQMHxlVXXRXf+MY38l0aAG1E0AGgy+nVq1csWrQoFi1alO9SAGgn3qMDAAAkR9ABAACSI+gAAADJEXQAAIDkCDoAAEByBB0AACA5gg4AAJAcQQcAAEiOoAMAACRH0AEAAJIj6AAAAMkRdAAAgOQIOgAAQHIEHQAAIDmCDgAAkBxBBwAASI6gAwAAJEfQAQAAkiPoAAAAyRF0AACA5Ag6AABAcgQdAAAgOYIOAACQHEEHAABIjqADAAAkR9ABAACSI+gAAADJEXQAAIDkCDoAAEByBB0AACA5hfkuAACgsxo656GGxy/cOuGEf56O9tbjikjr2Oj8rOgAAADJEXQAAIDkCDoAAEByBB0AACA5gg4AAJAcQQcAAEiOoAMAACRH0AEAAJIj6AAAAMkRdAAAgOQIOgAAQHIEHQAAIDmCDgAAkBxBBwAASI6gAwAAJEfQAQAAkiPoAAAAyRF0AACA5Ag6AABAcgQdAAAgOa0KOosXL46ysrIoLi6O8vLy2Lhx4zH719fXx7x582LIkCFRVFQU73nPe2LZsmWtKhgAAOB4CnMdsHr16pg1a1YsXrw4xowZE9/5zndi/Pjx8fTTT8cZZ5zR7JhLL700fv/738fSpUvjve99b+zevTsOHTr0josHAABoTs5BZ+HChTFlypSYOnVqREQsWrQofvazn8WSJUuiqqqqSf+HH3441q9fH88//3ycdtppERExdOjQd1Y1AADAMeR069rBgwejpqYmKioqGrVXVFTEpk2bmh3z4IMPxsiRI+O2226L008/Pc4666y49tpr409/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kNrbU2teMwMGDIjTTz89SkpKGtqGDx8eWZbFSy+9FMOGDWvXmjtCa+alqqoqxowZE9ddd11ERHzgAx+IU045JcaOHRs33XRTl1616Arn3+O55ppr4vOf//wx+wwdOrTh8SuvvBLjxo2LUaNGxT333NPO1XUeuc4Tb3gn139ozowZM+LBBx+MDRs2xKBBg/JdTofKe9Dp0aNHlJeXR3V1dfzN3/xNQ3t1dXV8+tOfbnbMqFGj4ic/+UmjtnXr1sXIkSPjpJNOatd6O0pr5iXijZWcK6+8MlatWpXs+wlynZvevXvHb37zm0Ztixcvjv/8z/+MBx54IMrKytq95o7QmtfMmDFj4v7774/XXnst3vWud0VExLPPPhvdunVL5mTYmnl5/fXXm9zi2L1794j4v9WLrqornH+Pp2/fvtG3b98W9X355Zdj3LhxUV5eHsuXL49u3TrNjRTtLpd54v+09voPb5dlWcyYMSPWrFkTjzzySDL/v5OTfHwCwtv94Ac/yE466aRs6dKl2dNPP53NmjUrO+WUU7IXXnghy7IsmzNnTvbFL36xof/zzz+fnXzyydns2bOzp59+Olu6dGl20kknZQ888EC+DqFd5Dov9913X1ZYWJjddddd2c6dOxu2P/7xj/k6hHaT69y8XaqfupbrvOzfvz8bNGhQ9nd/93fZU089la1fvz4bNmxYNnXq1HwdQrvIdV6WL1+eFRYWZosXL86ee+657NFHH81GjhyZnX/++fk6hHazf//+rLa2Nqutrc0iIlu4cGFWW1ubvfjii1mWdd3zb1t4+eWXs/e+973ZhRdemL300kuNzss09uKLL2a1tbXZggULsne9610Nr8n9+/fnu7S8ON45i+Ofu8iyL3/5y1lJSUn2yCOPNDr/vP766/kurcN0iqCTZVl21113ZUOGDMl69OiRfehDH2r00XeXX3559rGPfaxR/0ceeST74Ac/mPXo0SMbOnRotmTJkg6uuGPkMi8f+9jHsohosl1++eUdX3gHyPU181apBp0sy31etm7dml100UVZz549s0GDBmWVlZVJngRznZfbb789e9/73pf17NkzGzBgQPaFL3whe+mllzq46vb3i1/84pjnja58/n2nli9f3uzcdpK/MXYql19+ebPz9Itf/CLfpeXNsc5ZHP/cRXbU88/y5cvzXVqHKciyLn4fBgAAkJyuc7MwAADQZQg6AABAcgQdAAAgOYIOAACQHEEHAABIjqADAAAkR9ABAACSI+gAAADJEXQAAIDkCDoAAEByBB0AACA5gg4AAJCc/w8WkCU+tMA2eAAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 1000x500 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "from matplotlib import pyplot as plt\n",
    "import numpy as np\n",
    "fig1 = plt.figure(figsize=(10,5))\n",
    "plt.subplot(121)\n",
    "plt.subplot(122)\n",
    "plt.hist(X_norm[:,1],bins=100)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 259,
   "id": "62dd7422-902e-4540-96f9-143359493631",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[7.69782066e-01 1.79732174e-01 2.87020467e-02 7.28544965e-03\n",
      " 3.77821084e-03 1.60886312e-03 1.06216641e-03 9.34969692e-04\n",
      " 7.75228662e-04 5.61080466e-04 5.24076691e-04 4.02721169e-04\n",
      " 3.00759100e-04 2.39190049e-04 2.17194887e-04 1.86574383e-04\n",
      " 1.71983178e-04 1.48240812e-04 1.35162656e-04 1.17943855e-04]\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<BarContainer object of 20 artists>"
      ]
     },
     "execution_count": 259,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": [
       "([<matplotlib.axis.XTick at 0x1c1ac362a80>,\n",
       "  <matplotlib.axis.XTick at 0x1c1ac362930>,\n",
       "  <matplotlib.axis.XTick at 0x1c1ac445cd0>,\n",
       "  <matplotlib.axis.XTick at 0x1c1ac4440e0>,\n",
       "  <matplotlib.axis.XTick at 0x1c1ac4ea870>,\n",
       "  <matplotlib.axis.XTick at 0x1c1ac3ff3b0>,\n",
       "  <matplotlib.axis.XTick at 0x1c1ac417290>,\n",
       "  <matplotlib.axis.XTick at 0x1c1ac416f30>,\n",
       "  <matplotlib.axis.XTick at 0x1c1ac417fe0>,\n",
       "  <matplotlib.axis.XTick at 0x1c1ac4173b0>,\n",
       "  <matplotlib.axis.XTick at 0x1c1ac416960>,\n",
       "  <matplotlib.axis.XTick at 0x1c1beadf1d0>,\n",
       "  <matplotlib.axis.XTick at 0x1c1beade0f0>,\n",
       "  <matplotlib.axis.XTick at 0x1c1beadc320>,\n",
       "  <matplotlib.axis.XTick at 0x1c1ac33a2a0>,\n",
       "  <matplotlib.axis.XTick at 0x1c1beadf530>,\n",
       "  <matplotlib.axis.XTick at 0x1c1ac339bb0>,\n",
       "  <matplotlib.axis.XTick at 0x1c1ac33b3b0>,\n",
       "  <matplotlib.axis.XTick at 0x1c1ac33b350>,\n",
       "  <matplotlib.axis.XTick at 0x1c1bea82180>],\n",
       " [Text(1, 0, '1'),\n",
       "  Text(2, 0, '2'),\n",
       "  Text(3, 0, '3'),\n",
       "  Text(4, 0, '4'),\n",
       "  Text(5, 0, '5'),\n",
       "  Text(6, 0, '6'),\n",
       "  Text(7, 0, '7'),\n",
       "  Text(8, 0, '8'),\n",
       "  Text(9, 0, '9'),\n",
       "  Text(10, 0, '10'),\n",
       "  Text(11, 0, '11'),\n",
       "  Text(12, 0, '12'),\n",
       "  Text(13, 0, '13'),\n",
       "  Text(14, 0, '14'),\n",
       "  Text(15, 0, '15'),\n",
       "  Text(16, 0, '16'),\n",
       "  Text(17, 0, '17'),\n",
       "  Text(18, 0, '18'),\n",
       "  Text(19, 0, '19'),\n",
       "  Text(20, 0, '20')])"
      ]
     },
     "execution_count": 259,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": [
       "Text(0, 0.5, 'variance ratio ')"
      ]
     },
     "execution_count": 259,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjcAAAGfCAYAAACjj/OwAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAAA0q0lEQVR4nO3dfVxUdf7//+cIcpHJuIJcJSJeE5gpbApmfSqj0Jtl7Sdx3bxIbZdPlgLmJtmWWRtm6mrbQlFaa3ZBbebaShpbahifLkQoW/105cWQDbFQgRctKJzfH/6c706gMszgwNnH/XY7txvznnNe5zXcOM7T95xzxmIYhiEAAACT6OLtBgAAADyJcAMAAEyFcAMAAEyFcAMAAEyFcAMAAEyFcAMAAEyFcAMAAEyFcAMAAEyFcAMAAEyFcAMAAEzF19sN5Obm6rHHHpPdbldcXJxWrVqlMWPGnHH9F154QcuWLdMXX3whq9Wq66+/XsuXL1dwcHCr9tfU1KRvvvlG3bt3l8Vi8dTLAAAA7cgwDB05ckSRkZHq0uUcczOGF7388stG165djaefftrYu3evMW/ePKNbt27GoUOHWly/uLjY6NKli7F69Wpj//79RnFxsREXF2dMnDix1fusqKgwJLGwsLCwsLB0wqWiouKc7/UWw/DeF2eOHDlSI0aMUF5enmMsNjZWEydOVE5OTrP1ly9frry8PH311VeOsT/+8Y9atmyZKioqWrXP2tpa9ejRQxUVFQoKCnL/RQAAgHZXV1enqKgo/fDDD7JarWdd12sfSzU0NKi0tFQLFy50Gk9JSVFJSUmL2yQnJ2vRokUqLCxUamqqqqqq9Je//EXjx48/437q6+tVX1/veHzkyBFJUlBQEOEGAIBOpjWnlHjthOLq6mo1NjYqLCzMaTwsLEyVlZUtbpOcnKwXXnhBaWlp8vPzU3h4uHr06KE//vGPZ9xPTk6OrFarY4mKivLo6wAAAB2L16+W+mkCMwzjjKls7969mjt3ru6//36VlpZqy5YtOnDggNLT089YPzs7W7W1tY6ltR9fAQCAzslrH0uFhITIx8en2SxNVVVVs9mc03JycjR69GgtWLBAknTJJZeoW7duGjNmjB5++GFFREQ028bf31/+/v6efwEAAKBD8trMjZ+fnxISElRUVOQ0XlRUpOTk5Ba3OX78eLPLv3x8fCSdmvEBAADw6sdSWVlZeuaZZ7R27Vrt27dPmZmZstlsjo+ZsrOzNW3aNMf6EyZM0IYNG5SXl6f9+/frvffe09y5c3XZZZcpMjLSWy8DAAB0IF69iV9aWppqamq0ZMkS2e12xcfHq7CwUNHR0ZIku90um83mWH/GjBk6cuSInnjiCc2fP189evTQ1VdfrUcffdRbLwEAAHQwXr3PjTfU1dXJarWqtraWS8EBAOgkXHn/9vrVUgAAAJ5EuAEAAKZCuAEAAKZCuAEAAKZCuAEAAKZCuAEAAKZCuAEAAKbi1Zv4mVHfhZs9Uufg0vEeqQMAwH8aZm4AAICpEG4AAICpEG4AAICpEG4AAICpEG4AAICpEG4AAICpEG4AAICpEG4AAICpEG4AAICpEG4AAICpEG4AAICpEG4AAICpEG4AAICpEG4AAICpEG4AAICpEG4AAICpEG4AAICpEG4AAICpEG4AAICpEG4AAICpEG4AAICpEG4AAICpEG4AAICpEG4AAICpEG4AAICpEG4AAICpEG4AAICpeD3c5ObmKiYmRgEBAUpISFBxcfEZ150xY4YsFkuzJS4u7jx2DAAAOjKvhpuCggJlZGRo0aJFKisr05gxY5Samiqbzdbi+qtXr5bdbncsFRUV6tmzp2655Zbz3DkAAOiovBpuVq5cqVmzZmn27NmKjY3VqlWrFBUVpby8vBbXt1qtCg8Pdyy7du3S999/r9tuu+08dw4AADoqr4WbhoYGlZaWKiUlxWk8JSVFJSUlraqxZs0ajR07VtHR0Wdcp76+XnV1dU4LAAAwL6+Fm+rqajU2NiosLMxpPCwsTJWVlefc3m63680339Ts2bPPul5OTo6sVqtjiYqKcqtvAADQsXn9hGKLxeL02DCMZmMtee6559SjRw9NnDjxrOtlZ2ertrbWsVRUVLjTLgAA6OB8vbXjkJAQ+fj4NJulqaqqajab81OGYWjt2rWaOnWq/Pz8zrquv7+//P393e4XAAB0Dl6bufHz81NCQoKKioqcxouKipScnHzWbXfs2KEvv/xSs2bNas8WAQBAJ+S1mRtJysrK0tSpU5WYmKikpCTl5+fLZrMpPT1d0qmPlA4fPqx169Y5bbdmzRqNHDlS8fHx3mgbAAB0YF4NN2lpaaqpqdGSJUtkt9sVHx+vwsJCx9VPdru92T1vamtr9dprr2n16tXeaBkAAHRwFsMwDG83cT7V1dXJarWqtrZWQUFBHq/fd+Fmj9Q5uHS8R+oAAGAGrrx/e/1qKQAAAE8i3AAAAFMh3AAAAFMh3AAAAFMh3AAAAFMh3AAAAFMh3AAAAFMh3AAAAFMh3AAAAFMh3AAAAFMh3AAAAFMh3AAAAFMh3AAAAFMh3AAAAFMh3AAAAFMh3AAAAFMh3AAAAFMh3AAAAFMh3AAAAFMh3AAAAFMh3AAAAFMh3AAAAFMh3AAAAFMh3AAAAFMh3AAAAFMh3AAAAFMh3AAAAFMh3AAAAFMh3AAAAFMh3AAAAFMh3AAAAFMh3AAAAFMh3AAAAFMh3AAAAFPxerjJzc1VTEyMAgIClJCQoOLi4rOuX19fr0WLFik6Olr+/v7q37+/1q5de566BQAAHZ2vN3deUFCgjIwM5ebmavTo0XrqqaeUmpqqvXv3qk+fPi1uM2nSJH377bdas2aNBgwYoKqqKp08efI8dw4AADoqi2EYhrd2PnLkSI0YMUJ5eXmOsdjYWE2cOFE5OTnN1t+yZYsmT56s/fv3q2fPnm3aZ11dnaxWq2praxUUFNTm3s+k78LNHqlzcOl4j9QBAMAMXHn/9trHUg0NDSotLVVKSorTeEpKikpKSlrcZtOmTUpMTNSyZct00UUXadCgQbr77rv1448/no+WAQBAJ+C1j6Wqq6vV2NiosLAwp/GwsDBVVla2uM3+/fu1c+dOBQQE6PXXX1d1dbXuuOMOfffdd2c876a+vl719fWOx3V1dZ57EQAAoMPx+gnFFovF6bFhGM3GTmtqapLFYtELL7ygyy67TOPGjdPKlSv13HPPnXH2JicnR1ar1bFERUV5/DUAAICOw2vhJiQkRD4+Ps1maaqqqprN5pwWERGhiy66SFar1TEWGxsrwzD09ddft7hNdna2amtrHUtFRYXnXgQAAOhwvBZu/Pz8lJCQoKKiIqfxoqIiJScnt7jN6NGj9c033+jo0aOOsc8//1xdunRR7969W9zG399fQUFBTgsAADAvr34slZWVpWeeeUZr167Vvn37lJmZKZvNpvT0dEmnZl2mTZvmWH/KlCkKDg7Wbbfdpr179+rdd9/VggULNHPmTAUGBnrrZQAAgA7Eq/e5SUtLU01NjZYsWSK73a74+HgVFhYqOjpakmS322Wz2RzrX3jhhSoqKtJdd92lxMREBQcHa9KkSXr44Ye99RIAAEAH49X73HgD97kBAKDz6RT3uQEAAGgPhBsAAGAqhBsAAGAqhBsAAGAqhBsAAGAqhBsAAGAqhBsAAGAqhBsAAGAqhBsAAGAqhBsAAGAqhBsAAGAqhBsAAGAqhBsAAGAqhBsAAGAqhBsAAGAqhBsAAGAqhBsAAGAqhBsAAGAqhBsAAGAqhBsAAGAqhBsAAGAqhBsAAGAqhBsAAGAqhBsAAGAqhBsAAGAqhBsAAGAqhBsAAGAqhBsAAGAqhBsAAGAqhBsAAGAqhBsAAGAqhBsAAGAqhBsAAGAqhBsAAGAqhBsAAGAqXg83ubm5iomJUUBAgBISElRcXHzGdbdv3y6LxdJs+b//+7/z2DEAAOjIvBpuCgoKlJGRoUWLFqmsrExjxoxRamqqbDbbWbf77LPPZLfbHcvAgQPPU8cAAKCj82q4WblypWbNmqXZs2crNjZWq1atUlRUlPLy8s66XWhoqMLDwx2Lj4/PeeoYAAB0dF4LNw0NDSotLVVKSorTeEpKikpKSs667fDhwxUREaFrrrlG27Zta882AQBAJ+Pblo2++uorrVq1Svv27ZPFYlFsbKzmzZun/v37t7pGdXW1GhsbFRYW5jQeFhamysrKFreJiIhQfn6+EhISVF9fr+eff17XXHONtm/friuuuKLFberr61VfX+94XFdX1+oeAQBA5+NyuNm6datuuOEGXXrppRo9erQMw1BJSYni4uL0xhtv6Nprr3WpnsVicXpsGEazsdMGDx6swYMHOx4nJSWpoqJCy5cvP2O4ycnJ0YMPPuhSTwAAoPNyOdwsXLhQmZmZWrp0abPxe+65p9XhJiQkRD4+Ps1maaqqqprN5pzNqFGjtH79+jM+n52draysLMfjuro6RUVFtbo+AADoXFw+52bfvn2aNWtWs/GZM2dq7969ra7j5+enhIQEFRUVOY0XFRUpOTm51XXKysoUERFxxuf9/f0VFBTktAAAAPNyeeamV69eKi8vb3b5dXl5uUJDQ12qlZWVpalTpyoxMVFJSUnKz8+XzWZTenq6pFOzLocPH9a6deskSatWrVLfvn0VFxenhoYGrV+/Xq+99ppee+01V18GAAAwKZfDze23365f//rX2r9/v5KTk2WxWLRz5049+uijmj9/vku10tLSVFNToyVLlshutys+Pl6FhYWKjo6WJNntdqd73jQ0NOjuu+/W4cOHFRgYqLi4OG3evFnjxo1z9WUAAACTshiGYbiygWEYWrVqlVasWKFvvvlGkhQZGakFCxZo7ty5ZzwZuKOoq6uT1WpVbW1tu3xE1XfhZo/UObh0vEfqAABgBq68f7s8c2OxWJSZmanMzEwdOXJEktS9e/e2dQoAAOBhbbrPzWmEGgAA0NG0KtyMGDFCb7/9tn72s59p+PDhZ/3oaffu3R5rDgAAwFWtCjc33nij/P39HT939PNqAADAf65WhZsHHnjA8fPixYvbqxcAAAC3uXwTv379+qmmpqbZ+A8//KB+/fp5pCkAAIC2cjncHDx4UI2Njc3G6+vr9fXXX3ukKQAAgLZq9dVSmzZtcvy8detWWa1Wx+PGxka9/fbbiomJ8Wx3AAAALmp1uJk4caKkU/e5mT59utNzXbt2Vd++fbVixQqPNgcAAOCqVoebpqYmSVJMTIw++ugjhYSEtFtTAAAAbeXyTfwOHDjQHn0AAAB4RJvuUHzs2DHt2LFDNptNDQ0NTs/NnTvXI40BAAC0hcvhpqysTOPGjdPx48d17Ngx9ezZU9XV1brgggsUGhpKuAEAAF7l8qXgmZmZmjBhgr777jsFBgbq/fff16FDh5SQkKDly5e3R48AAACt5nK4KS8v1/z58+Xj4yMfHx/V19crKipKy5Yt07333tsePQIAALSay+Gma9euju+WCgsLk81mkyRZrVbHzwAAAN7i8jk3w4cP165duzRo0CBdddVVuv/++1VdXa3nn39eQ4cObY8eAQAAWs3lmZtHHnlEERERkqSHHnpIwcHB+p//+R9VVVUpPz/f4w0CAAC4wqWZG8Mw1KtXL8XFxUmSevXqpcLCwnZpDAAAoC1cmrkxDEMDBw7kCzIBAECH5VK46dKliwYOHKiampr26gcAAMAtLp9zs2zZMi1YsECffvppe/QDAADgFpevlrr11lt1/PhxDRs2TH5+fgoMDHR6/rvvvvNYcwAAAK5yOdysWrWqHdoAAADwDJfDzfTp09ujDwAAAI9w+ZwbAACAjoxwAwAATIVwAwAATIVwAwAATKXN4ebLL7/U1q1b9eOPP0o6dfdiAAAAb3M53NTU1Gjs2LEaNGiQxo0bJ7vdLkmaPXu25s+f7/EGAQAAXOFyuMnMzJSvr69sNpsuuOACx3haWpq2bNni0eYAAABc5fJ9bt566y1t3bpVvXv3dhofOHCgDh065LHGAAAA2sLlmZtjx445zdicVl1dLX9/f480BQAA0FYuh5srrrhC69atczy2WCxqamrSY489pquuusqjzQEAALjK5XDz2GOP6amnnlJqaqoaGhr029/+VvHx8Xr33Xf16KOPutxAbm6uYmJiFBAQoISEBBUXF7dqu/fee0++vr669NJLXd4nAAAwL5fDzcUXX6xPPvlEl112ma699lodO3ZMN998s8rKytS/f3+XahUUFCgjI0OLFi1SWVmZxowZo9TUVNlstrNuV1tbq2nTpumaa65xtX0AAGByFsOLN6gZOXKkRowYoby8PMdYbGysJk6cqJycnDNuN3nyZA0cOFA+Pj7auHGjysvLW73Puro6Wa1W1dbWKigoyJ32W9R34WaP1Dm4dLxH6gAAYAauvH+7PHPz7LPP6tVXX202/uqrr+rPf/5zq+s0NDSotLRUKSkpTuMpKSkqKSk56/6/+uorPfDAA63aT319verq6pwWAABgXi6Hm6VLlyokJKTZeGhoqB555JFW16murlZjY6PCwsKcxsPCwlRZWdniNl988YUWLlyoF154Qb6+rbuKPScnR1ar1bFERUW1ukcAAND5uBxuDh06pJiYmGbj0dHR5zxXpiUWi8XpsWEYzcYkqbGxUVOmTNGDDz6oQYMGtbp+dna2amtrHUtFRYXLPQIAgM7D5Zv4hYaG6pNPPlHfvn2dxj/++GMFBwe3uk5ISIh8fHyazdJUVVU1m82RpCNHjmjXrl0qKyvTnXfeKUlqamqSYRjy9fXVW2+9pauvvrrZdv7+/tx/BwCA/yAuz9xMnjxZc+fO1bZt29TY2KjGxka98847mjdvniZPntzqOn5+fkpISFBRUZHTeFFRkZKTk5utHxQUpD179qi8vNyxpKena/DgwSovL9fIkSNdfSkAAMCEXJ65efjhh3Xo0CFdc801jvNempqaNG3aNJfOuZGkrKwsTZ06VYmJiUpKSlJ+fr5sNpvS09MlnfpI6fDhw1q3bp26dOmi+Ph4p+1DQ0MVEBDQbBwAAPzncjnc+Pn5qaCgQA899JA+/vhjBQYGaujQoYqOjnZ552lpaaqpqdGSJUtkt9sVHx+vwsJCRy273d6m83gAAMB/Lq/e58YbuM8NAACdjyvv3y7P3DQ2Nuq5557T22+/raqqKjU1NTk9/84777haEgAAwGNcDjfz5s3Tc889p/Hjxys+Pr7Fy7YBAAC8xeVw8/LLL+uVV17RuHHj2qMfAAAAt7h8Kbifn58GDBjQHr0AAAC4zeVwM3/+fK1evVr/YechAwCATsLlj6V27typbdu26c0331RcXJy6du3q9PyGDRs81hwAAICrXA43PXr00E033dQevQAAALjN5XDz7LPPtkcfAAAAHuHyOTcAAAAdmcszN5L0l7/8Ra+88opsNpsaGhqcntu9e7dHGgMAAGgLl2duHn/8cd12220KDQ1VWVmZLrvsMgUHB2v//v1KTU1tjx4BAABazeVwk5ubq/z8fD3xxBPy8/PTb3/7WxUVFWnu3Lmqra1tjx4BAABazeVwY7PZlJycLEkKDAzUkSNHJElTp07VSy+95NnuAAAAXORyuAkPD1dNTY0kKTo6Wu+//74k6cCBA9zYDwAAeJ3L4ebqq6/WG2+8IUmaNWuWMjMzde211yotLY373wAAAK9z+Wqp/Px8NTU1SZLS09PVs2dP7dy5UxMmTFB6errHGwQAAHCFy+GmS5cu6tLl/034TJo0SZMmTfJoUwAAAG3VqnDzySefKD4+Xl26dNEnn3xy1nUvueQSjzQGAADQFq0KN5deeqkqKysVGhqqSy+9VBaLpcWThy0WixobGz3eJAAAQGu1KtwcOHBAvXr1cvwMAADQUbUq3ERHR0uSTpw4ocWLF+t3v/ud+vXr166NAQAAtIVLl4J37dpVr7/+env1AgAA4DaX73Nz0003aePGje3QCgAAgPtcvhR8wIABeuihh1RSUqKEhAR169bN6fm5c+d6rDkAAABXuRxunnnmGfXo0UOlpaUqLS11es5isRBuAACAV7kcbrhaCgAAdGQun3MDAADQkbk8cyNJX3/9tTZt2iSbzaaGhgan51auXOmRxgAAANrC5XDz9ttv64YbblBMTIw+++wzxcfH6+DBgzIMQyNGjGiPHgEAAFrN5Y+lsrOzNX/+fH366acKCAjQa6+9poqKCl155ZW65ZZb2qNHAACAVnM53Ozbt0/Tp0+XJPn6+urHH3/UhRdeqCVLlujRRx/1eIMAAACucDncdOvWTfX19ZKkyMhIffXVV47nqqurPdcZAABAG7h8zs2oUaP03nvv6eKLL9b48eM1f/587dmzRxs2bNCoUaPao0cAAIBWczncrFy5UkePHpUkLV68WEePHlVBQYEGDBigP/zhDx5vEAAAwBUuh5t//zbwCy64QLm5uR5tCAAAwB0un3Nz22236e2335ZhGB5pIDc3VzExMQoICFBCQoKKi4vPuO7OnTs1evRoBQcHKzAwUEOGDGG2CAAAOHE53NTU1Gj8+PHq3bu35s+fr/Ly8jbvvKCgQBkZGVq0aJHKyso0ZswYpaamymaztbh+t27ddOedd+rdd9/Vvn37dN999+m+++5Tfn5+m3sAAADmYjHaMAXzww8/6JVXXtGLL76o4uJiDR48WLfeequmTJmivn37trrOyJEjNWLECOXl5TnGYmNjNXHiROXk5LSqxs0336xu3brp+eefb9X6dXV1slqtqq2tVVBQUKt7ba2+Czd7pM7BpeM9UgcAADNw5f27Td8t1aNHD/3617/W9u3bdejQId122216/vnnNWDAgFbXaGhoUGlpqVJSUpzGU1JSVFJS0qoaZWVlKikp0ZVXXnnGderr61VXV+e0AAAA83LrizNPnDihXbt26YMPPtDBgwcVFhbW6m2rq6vV2NjYbJuwsDBVVlaeddvevXvL399fiYmJmjNnjmbPnn3GdXNycmS1Wh1LVFRUq3sEAACdT5vCzbZt23T77bcrLCxM06dPV/fu3fXGG2+ooqLC5VoWi8XpsWEYzcZ+qri4WLt27dKTTz6pVatW6aWXXjrjutnZ2aqtrXUsbekRAAB0Hi5fCt67d2/V1NTouuuu01NPPaUJEyYoICDA5R2HhITIx8en2SxNVVXVOWeAYmJiJElDhw7Vt99+q8WLF+uXv/xli+v6+/vL39/f5f4AAEDn5PLMzf33369vvvlGGzdu1C233NKmYCNJfn5+SkhIUFFRkdN4UVGRkpOTW13HMAzH10EAAAC4PHPz61//2mM7z8rK0tSpU5WYmKikpCTl5+fLZrMpPT1d0qmPlA4fPqx169ZJkv70pz+pT58+GjJkiKRT971Zvny57rrrLo/1BAAAOjeXw40npaWlqaamRkuWLJHdbld8fLwKCwsVHR0tSbLb7U73vGlqalJ2drYOHDggX19f9e/fX0uXLtVvfvMbb70EAADQwbTpPjedGfe5AQCg82n3+9wAAAB0VIQbAABgKoQbAABgKoQbAABgKoQbAABgKoQbAABgKoQbAABgKoQbAABgKoQbAABg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jzzyiCRp+PDh+sc//qG8vDyn70Bz15o1a5SamurSeQ5nU1BQoPXr1+vFF19UXFycysvLlZGRocjISE2fPt3t+s8//7xmzpypiy66SD4+PhoxYoSmTJmi3bt3e6B7Zz+dyTIMwyOzW+3txIkTmjx5spqampSbm+uxuldddZXKy8tVXV2tp59+WpMmTdIHH3yg0NDQNtcsLS3V6tWrtXv37nb53aalpTl+jo+PV2JioqKjo7V58+Y2B4bTJ8ffeOONyszMlCRdeumlKikp0ZNPPqkrr7zS/cb/f2vXrtWvfvUrj/279fjjj+v999/Xpk2bFB0drXfffVd33HGHIiIi3JrR7tq1q1577TXNmjVLPXv2lI+Pj8aOHev072NrnO19pSMfj8zcmMRdd92lTZs2adu2berdu7fH6vr5+WnAgAFKTExUTk6Ohg0bptWrV7tdt7S0VFVVVUpISJCvr698fX21Y8cOPf744/L19VVjY6MHuj+lW7duGjp0aKuuEjibiIiIZqEuNja2VVdjtNahQ4f097//XbNnz/ZYzQULFmjhwoWaPHmyhg4dqqlTpyozM9NjM2b9+/fXjh07dPToUVVUVOjDDz/UiRMnFBMT45H6khxXu/30f4VVVVXN/vfY0Zw4cUKTJk3SgQMHVFRU5LFZG+nU3/aAAQM0atQorVmzRr6+vlqzZo1bNYuLi1VVVaU+ffo4js1Dhw5p/vz56tu3r2ca/zcRERGKjo526/gMCQmRr69vux+fxcXF+uyzzzx2fP7444+69957tXLlSk2YMEGXXHKJ7rzzTqWlpWn58uVu109ISHD859Rut2vLli2qqalp9bF5pveVznA8Em46OcMwdOedd2rDhg165513PPqGcqb9uTN9fNo111yjPXv2qLy83LEkJibqV7/6lcrLy+Xj4+OBbk+pr6/Xvn37FBER4Vad0aNHN7sc8vPPP3d80asnPPvsswoNDdX48eM9VvP48ePq0sX5UPfx8fHYpeCndevWTREREfr++++1detW3XjjjR6rHRMTo/DwcMdVZNKp80x27Nih5ORkj+3H004Hmy+++EJ///vfFRwc3K7788TxOXXqVH3yySdOx2ZkZKQWLFigrVu3eqjT/6empkYVFRVuHZ9+fn76+c9/3u7H55o1a5SQkOCR85qkU38fJ06caPfj02q1qlevXvriiy+0a9eucx6b53pf6QzHIx9LnSdHjx7Vl19+6Xh84MABlZeXq2fPnurTp0+b686ZM0cvvvii/vrXv6p79+6OJG21WhUYGOhWz/fee69SU1MVFRWlI0eO6OWXX9b27du1ZcsWt+pKp87V+Ol5Qd26dVNwcLDb5wvdfffdmjBhgvr06aOqqio9/PDDqqurc/sjmMzMTCUnJ+uRRx7RpEmT9OGHHyo/P1/5+flu1T2tqalJzz77rKZPny5fX88dmhMmTNDvf/979enTR3FxcSorK9PKlSs1c+ZMj9TfunWrDMPQ4MGD9eWXX2rBggUaPHiwbrvtNpfqnOsYycjI0COPPKKBAwdq4MCBeuSRR3TBBRdoypQpbtX97rvvZLPZHPefOf0GGR4efs77I52tdmRkpP77v/9bu3fv1t/+9jc1NjY6js+ePXvKz8+vzbWDg4P1+9//XjfccIMiIiJUU1Oj3Nxcff311626fcC5fic/DWFdu3ZVeHi4Bg8e7Fbtnj17avHixfrFL36hiIgIHTx4UPfee69CQkJ00003udXzggULlJaWpiuuuEJXXXWVtmzZojfeeEPbt293+/chSXV1dXr11Ve1YsWKc9ZzpfaVV16pBQsWKDAwUNHR0dqxY4fWrVunlStXul371VdfVa9evdSnTx/t2bNH8+bN08SJE51OBG7Jud5XTt+TrC3H43njrcu0/tNs27bNkNRsmT59ult1W6opyXj22Wfd7nnmzJlGdHS04efnZ/Tq1cu45pprjLfeesvtumfiqUvB09LSjIiICKNr165GZGSkcfPNNxv/+Mc/3G/QMIw33njDiI+PN/z9/Y0hQ4YY+fn5HqlrGIaxdetWQ5Lx2WefeaymYRhGXV2dMW/ePKNPnz5GQECA0a9fP2PRokVGfX29R+oXFBQY/fr1M/z8/Izw8HBjzpw5xg8//OBynXMdI01NTcYDDzxghIeHG/7+/sYVV1xh7Nmzx+26zz77bIvPP/DAA27VPn1peUvLtm3b3Kr9448/GjfddJMRGRlp+Pn5GREREcYNN9xgfPjhh+es25rfyU+5cin42WofP37cSElJMXr16mV07drV6NOnjzF9+nTDZrN5pOc1a9YYAwYMMAICAoxhw4YZGzdudLvn05566ikjMDDQ5b/tc9W22+3GjBkzjMjISCMgIMAYPHiwsWLFilbdBuJctVevXm307t3b8bu+7777WnXct+Z9pa3H4/liMQzDaEMmAgAA6JA45wYAAJgK4QYAAJgK4QYAAJgK4QYAAJgK4QYAAJgK4QYAAJgK4QYAAJgK4QYAAJgK4QYAAJgK4QYAAJgK4QYAAJgK4QYAAJjK/we+muIxotBvTQAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from sklearn.decomposition import PCA \n",
    "pca = PCA(n_components=20)\n",
    "X_pca = pca.fit_transform(X)\n",
    "\n",
    "var_ratio = pca.explained_variance_ratio_#计算比例\n",
    "print(var_ratio)\n",
    "\n",
    "#主成分\n",
    "fig2 = plt.figure()\n",
    "plt.bar(list(range(1, 21)),var_ratio)\n",
    "plt.xticks(list(range(1, 21)),list(range(1, 21)))\n",
    "plt.ylabel(\"variance ratio \")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 260,
   "id": "7b352bad-9471-41aa-8ceb-2c4832a17398",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x1c1ac3fdd00>"
      ]
     },
     "execution_count": 260,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig3 = plt.figure()\n",
    "s1= plt.scatter(X_pca[:,0][y=='O'],X_pca[:,1][y=='O'])\n",
    "s2 = plt.scatter(X_pca[:,0][y=='B'],X_pca[:,1][y=='B'])\n",
    "s3 = plt.scatter(X_pca[:,0][y=='A'],X_pca[:,1][y=='A'])\n",
    "s4 = plt.scatter(X_pca[:,0][y=='F'],X_pca[:,1][y=='F'])\n",
    "s5 = plt.scatter(X_pca[:,0][y=='G'],X_pca[:,1][y=='G'])\n",
    "s6 = plt.scatter(X_pca[:,0][y=='K'],X_pca[:,1][y=='K'])\n",
    "s7 = plt.scatter(X_pca[:,0][y=='M'],X_pca[:,1][y=='M'])\n",
    "plt.legend((s1,s2,s3,s4,s5,s6,s7),('s1','s2','s3','s4','s5','s6','s7'))\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 251,
   "id": "d14f69ec-0c99-459b-a2cf-b46b2b85e802",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-51 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: black;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-51 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-51 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-51 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-51 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-51 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-51 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-51 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-51 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-51 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-51 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-51 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-51 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-51 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-51 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-51 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "#sk-container-id-51 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-51 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-51 div.sk-toggleable__content {\n",
       "  max-height: 0;\n",
       "  max-width: 0;\n",
       "  overflow: hidden;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-51 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-51 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-51 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-51 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  max-height: 200px;\n",
       "  max-width: 100%;\n",
       "  overflow: auto;\n",
       "}\n",
       "\n",
       "#sk-container-id-51 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-51 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-51 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-51 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-51 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-51 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-51 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-51 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-51 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-51 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-51 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-51 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-51 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-51 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-51 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 1ex;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-51 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-51 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-51 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-51 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "</style><div id=\"sk-container-id-51\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>KNeighborsClassifier(n_neighbors=3)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-63\" type=\"checkbox\" checked><label for=\"sk-estimator-id-63\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;&nbsp;KNeighborsClassifier<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.neighbors.KNeighborsClassifier.html\">?<span>Documentation for KNeighborsClassifier</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>KNeighborsClassifier(n_neighbors=3)</pre></div> </div></div></div></div>"
      ],
      "text/plain": [
       "KNeighborsClassifier(n_neighbors=3)"
      ]
     },
     "execution_count": 251,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.7952380952380952\n"
     ]
    }
   ],
   "source": [
    "train, test, trlabel, telabel = train_test_split(X_pca, y, test_size = 0.3, random_state = 731)\n",
    "X_train = train\n",
    "y_train = trlabel\n",
    "X_test = test\n",
    "y_test = telabel\n",
    "\n",
    "\n",
    "KNN = KNeighborsClassifier(n_neighbors=3)\n",
    "KNN.fit(X_train,y_train)\n",
    "y_predict = KNN.predict(X_test)\n",
    "from sklearn.metrics import accuracy_score\n",
    "accuracy = accuracy_score(y_test,y_predict)\n",
    "print(accuracy)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 252,
   "id": "0fa71970-8ead-4eee-b40b-da14fc0ffd6a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(700, 15)\n"
     ]
    }
   ],
   "source": [
    "from sklearn.decomposition import PCA \n",
    "pca = PCA(n_components=15)\n",
    "X_pca = pca.fit_transform(X)\n",
    "print(X_pca.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 253,
   "id": "2ef38dcf-c76c-4d02-93bd-20b5646c61e7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "      <th>4</th>\n",
       "      <th>5</th>\n",
       "      <th>6</th>\n",
       "      <th>7</th>\n",
       "      <th>8</th>\n",
       "      <th>9</th>\n",
       "      <th>10</th>\n",
       "      <th>11</th>\n",
       "      <th>12</th>\n",
       "      <th>13</th>\n",
       "      <th>14</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>-7.762824</td>\n",
       "      <td>-8.188314</td>\n",
       "      <td>2.471212</td>\n",
       "      <td>1.089296</td>\n",
       "      <td>-2.040438</td>\n",
       "      <td>-0.931481</td>\n",
       "      <td>2.518284</td>\n",
       "      <td>-0.440989</td>\n",
       "      <td>0.881675</td>\n",
       "      <td>2.024005</td>\n",
       "      <td>1.036489</td>\n",
       "      <td>-1.457729</td>\n",
       "      <td>3.209370</td>\n",
       "      <td>-0.245297</td>\n",
       "      <td>1.479231</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-10.851157</td>\n",
       "      <td>4.094701</td>\n",
       "      <td>-2.558630</td>\n",
       "      <td>-0.444494</td>\n",
       "      <td>0.506802</td>\n",
       "      <td>-0.236448</td>\n",
       "      <td>0.166946</td>\n",
       "      <td>0.586397</td>\n",
       "      <td>0.080781</td>\n",
       "      <td>-0.071840</td>\n",
       "      <td>0.298278</td>\n",
       "      <td>-0.104462</td>\n",
       "      <td>-0.277099</td>\n",
       "      <td>0.291997</td>\n",
       "      <td>0.117990</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-10.148024</td>\n",
       "      <td>2.565088</td>\n",
       "      <td>-2.777498</td>\n",
       "      <td>-0.393389</td>\n",
       "      <td>0.773266</td>\n",
       "      <td>0.068797</td>\n",
       "      <td>-0.267047</td>\n",
       "      <td>0.134440</td>\n",
       "      <td>0.542406</td>\n",
       "      <td>-0.300938</td>\n",
       "      <td>0.372959</td>\n",
       "      <td>-0.598847</td>\n",
       "      <td>-0.563237</td>\n",
       "      <td>0.129858</td>\n",
       "      <td>0.586515</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>17.094685</td>\n",
       "      <td>6.508274</td>\n",
       "      <td>1.769198</td>\n",
       "      <td>2.395818</td>\n",
       "      <td>1.125335</td>\n",
       "      <td>-0.717889</td>\n",
       "      <td>0.063926</td>\n",
       "      <td>0.436535</td>\n",
       "      <td>-0.302129</td>\n",
       "      <td>0.174004</td>\n",
       "      <td>-0.442405</td>\n",
       "      <td>-0.100028</td>\n",
       "      <td>0.333037</td>\n",
       "      <td>-0.021314</td>\n",
       "      <td>0.212497</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-5.225840</td>\n",
       "      <td>1.237993</td>\n",
       "      <td>-1.586885</td>\n",
       "      <td>-0.502145</td>\n",
       "      <td>-0.066865</td>\n",
       "      <td>-0.427361</td>\n",
       "      <td>0.080287</td>\n",
       "      <td>0.147066</td>\n",
       "      <td>-0.435459</td>\n",
       "      <td>-0.076890</td>\n",
       "      <td>0.074225</td>\n",
       "      <td>0.166254</td>\n",
       "      <td>0.109756</td>\n",
       "      <td>0.104759</td>\n",
       "      <td>0.020830</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>695</th>\n",
       "      <td>15.543615</td>\n",
       "      <td>7.695346</td>\n",
       "      <td>2.277140</td>\n",
       "      <td>-0.078458</td>\n",
       "      <td>-1.886860</td>\n",
       "      <td>0.569684</td>\n",
       "      <td>0.268876</td>\n",
       "      <td>0.028723</td>\n",
       "      <td>-0.229168</td>\n",
       "      <td>0.042497</td>\n",
       "      <td>0.305992</td>\n",
       "      <td>0.329261</td>\n",
       "      <td>-0.012418</td>\n",
       "      <td>-0.065759</td>\n",
       "      <td>-0.024552</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>696</th>\n",
       "      <td>19.692522</td>\n",
       "      <td>0.782494</td>\n",
       "      <td>1.168975</td>\n",
       "      <td>2.965343</td>\n",
       "      <td>1.118523</td>\n",
       "      <td>-0.435969</td>\n",
       "      <td>0.190523</td>\n",
       "      <td>0.178107</td>\n",
       "      <td>-0.329782</td>\n",
       "      <td>-0.113027</td>\n",
       "      <td>-0.170986</td>\n",
       "      <td>0.130304</td>\n",
       "      <td>0.144386</td>\n",
       "      <td>0.184961</td>\n",
       "      <td>-0.067458</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>697</th>\n",
       "      <td>-22.782015</td>\n",
       "      <td>18.330639</td>\n",
       "      <td>-6.144400</td>\n",
       "      <td>0.513168</td>\n",
       "      <td>0.199705</td>\n",
       "      <td>-0.500797</td>\n",
       "      <td>0.007532</td>\n",
       "      <td>-0.497704</td>\n",
       "      <td>-0.111408</td>\n",
       "      <td>0.304510</td>\n",
       "      <td>0.042928</td>\n",
       "      <td>0.053350</td>\n",
       "      <td>-0.049164</td>\n",
       "      <td>-0.050437</td>\n",
       "      <td>-0.089209</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>698</th>\n",
       "      <td>1.789072</td>\n",
       "      <td>-6.018147</td>\n",
       "      <td>-3.386632</td>\n",
       "      <td>-1.082656</td>\n",
       "      <td>-0.147611</td>\n",
       "      <td>-0.232649</td>\n",
       "      <td>-0.465023</td>\n",
       "      <td>0.673680</td>\n",
       "      <td>-0.119490</td>\n",
       "      <td>0.222401</td>\n",
       "      <td>0.028543</td>\n",
       "      <td>-0.048183</td>\n",
       "      <td>-0.090647</td>\n",
       "      <td>0.291560</td>\n",
       "      <td>0.207396</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>699</th>\n",
       "      <td>-4.586373</td>\n",
       "      <td>-9.743429</td>\n",
       "      <td>-2.844250</td>\n",
       "      <td>0.828845</td>\n",
       "      <td>-1.070296</td>\n",
       "      <td>-0.176431</td>\n",
       "      <td>0.012290</td>\n",
       "      <td>0.621774</td>\n",
       "      <td>-0.140881</td>\n",
       "      <td>0.002460</td>\n",
       "      <td>0.310546</td>\n",
       "      <td>-0.074743</td>\n",
       "      <td>-0.323691</td>\n",
       "      <td>0.154601</td>\n",
       "      <td>-0.004301</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>700 rows × 15 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "            0          1         2         3         4         5         6   \\\n",
       "0    -7.762824  -8.188314  2.471212  1.089296 -2.040438 -0.931481  2.518284   \n",
       "1   -10.851157   4.094701 -2.558630 -0.444494  0.506802 -0.236448  0.166946   \n",
       "2   -10.148024   2.565088 -2.777498 -0.393389  0.773266  0.068797 -0.267047   \n",
       "3    17.094685   6.508274  1.769198  2.395818  1.125335 -0.717889  0.063926   \n",
       "4    -5.225840   1.237993 -1.586885 -0.502145 -0.066865 -0.427361  0.080287   \n",
       "..         ...        ...       ...       ...       ...       ...       ...   \n",
       "695  15.543615   7.695346  2.277140 -0.078458 -1.886860  0.569684  0.268876   \n",
       "696  19.692522   0.782494  1.168975  2.965343  1.118523 -0.435969  0.190523   \n",
       "697 -22.782015  18.330639 -6.144400  0.513168  0.199705 -0.500797  0.007532   \n",
       "698   1.789072  -6.018147 -3.386632 -1.082656 -0.147611 -0.232649 -0.465023   \n",
       "699  -4.586373  -9.743429 -2.844250  0.828845 -1.070296 -0.176431  0.012290   \n",
       "\n",
       "           7         8         9         10        11        12        13  \\\n",
       "0   -0.440989  0.881675  2.024005  1.036489 -1.457729  3.209370 -0.245297   \n",
       "1    0.586397  0.080781 -0.071840  0.298278 -0.104462 -0.277099  0.291997   \n",
       "2    0.134440  0.542406 -0.300938  0.372959 -0.598847 -0.563237  0.129858   \n",
       "3    0.436535 -0.302129  0.174004 -0.442405 -0.100028  0.333037 -0.021314   \n",
       "4    0.147066 -0.435459 -0.076890  0.074225  0.166254  0.109756  0.104759   \n",
       "..        ...       ...       ...       ...       ...       ...       ...   \n",
       "695  0.028723 -0.229168  0.042497  0.305992  0.329261 -0.012418 -0.065759   \n",
       "696  0.178107 -0.329782 -0.113027 -0.170986  0.130304  0.144386  0.184961   \n",
       "697 -0.497704 -0.111408  0.304510  0.042928  0.053350 -0.049164 -0.050437   \n",
       "698  0.673680 -0.119490  0.222401  0.028543 -0.048183 -0.090647  0.291560   \n",
       "699  0.621774 -0.140881  0.002460  0.310546 -0.074743 -0.323691  0.154601   \n",
       "\n",
       "           14  \n",
       "0    1.479231  \n",
       "1    0.117990  \n",
       "2    0.586515  \n",
       "3    0.212497  \n",
       "4    0.020830  \n",
       "..        ...  \n",
       "695 -0.024552  \n",
       "696 -0.067458  \n",
       "697 -0.089209  \n",
       "698  0.207396  \n",
       "699 -0.004301  \n",
       "\n",
       "[700 rows x 15 columns]"
      ]
     },
     "execution_count": 253,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "principalComponents = pca.fit_transform(X)\n",
    "principalDf = pd.DataFrame(data = principalComponents, columns = list(range(0,15)))\n",
    "principalDf"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 254,
   "id": "4926a914-061c-4d9c-b444-401a74c6dd12",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-52 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: black;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-52 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-52 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-52 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-52 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-52 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-52 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-52 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-52 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-52 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-52 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-52 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-52 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-52 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-52 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-52 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "#sk-container-id-52 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-52 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-52 div.sk-toggleable__content {\n",
       "  max-height: 0;\n",
       "  max-width: 0;\n",
       "  overflow: hidden;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-52 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-52 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-52 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-52 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  max-height: 200px;\n",
       "  max-width: 100%;\n",
       "  overflow: auto;\n",
       "}\n",
       "\n",
       "#sk-container-id-52 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-52 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-52 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-52 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-52 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-52 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-52 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-52 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-52 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-52 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-52 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-52 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-52 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-52 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-52 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 1ex;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-52 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-52 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-52 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-52 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "</style><div id=\"sk-container-id-52\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>RandomForestClassifier(max_features=3, n_estimators=30)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-64\" type=\"checkbox\" checked><label for=\"sk-estimator-id-64\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;&nbsp;RandomForestClassifier<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.ensemble.RandomForestClassifier.html\">?<span>Documentation for RandomForestClassifier</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>RandomForestClassifier(max_features=3, n_estimators=30)</pre></div> </div></div></div></div>"
      ],
      "text/plain": [
       "RandomForestClassifier(max_features=3, n_estimators=30)"
      ]
     },
     "execution_count": 254,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rf = RandomForestClassifier(criterion='gini',max_features=3,n_estimators=30)\n",
    "rf.fit(X_train, y_train)\n",
    "y_test_pred = rf.predict(X_test)\n",
    "y_test_prob = rf.predict_proba(X_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 255,
   "id": "d6970800-0be2-426d-bd6b-6c545abf3f0d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-53 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: black;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-53 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-53 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-53 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-53 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-53 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-53 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-53 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-53 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-53 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-53 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-53 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-53 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-53 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-53 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-53 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "#sk-container-id-53 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-53 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-53 div.sk-toggleable__content {\n",
       "  max-height: 0;\n",
       "  max-width: 0;\n",
       "  overflow: hidden;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-53 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-53 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-53 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-53 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  max-height: 200px;\n",
       "  max-width: 100%;\n",
       "  overflow: auto;\n",
       "}\n",
       "\n",
       "#sk-container-id-53 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-53 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-53 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-53 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-53 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-53 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-53 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-53 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-53 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-53 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-53 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-53 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-53 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-53 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-53 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 1ex;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-53 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-53 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-53 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-53 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "</style><div id=\"sk-container-id-53\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>RandomForestClassifier(n_estimators=50)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-65\" type=\"checkbox\" checked><label for=\"sk-estimator-id-65\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;&nbsp;RandomForestClassifier<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.ensemble.RandomForestClassifier.html\">?<span>Documentation for RandomForestClassifier</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>RandomForestClassifier(n_estimators=50)</pre></div> </div></div></div></div>"
      ],
      "text/plain": [
       "RandomForestClassifier(n_estimators=50)"
      ]
     },
     "execution_count": 255,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 通过RandomForestClassifier类定义一个随机森林模型，名字叫rf\n",
    "rf = RandomForestClassifier(n_estimators = 50)\n",
    "rf.fit(X_train, y_train)  # 对lr模型进行训练(fit)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 256,
   "id": "bcd489fb-b85c-49c7-b5c6-cbc68dfd5164",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-54 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: black;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-54 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-54 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-54 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-54 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-54 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-54 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-54 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-54 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-54 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-54 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-54 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-54 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-54 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-54 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-54 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "#sk-container-id-54 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-54 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-54 div.sk-toggleable__content {\n",
       "  max-height: 0;\n",
       "  max-width: 0;\n",
       "  overflow: hidden;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-54 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-54 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-54 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-54 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  max-height: 200px;\n",
       "  max-width: 100%;\n",
       "  overflow: auto;\n",
       "}\n",
       "\n",
       "#sk-container-id-54 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-54 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-54 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-54 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-54 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-54 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-54 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-54 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-54 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-54 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-54 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-54 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-54 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-54 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-54 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 1ex;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-54 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-54 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-54 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-54 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "</style><div id=\"sk-container-id-54\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>GridSearchCV(cv=5, estimator=RandomForestClassifier(n_estimators=50),\n",
       "             param_grid={&#x27;criterion&#x27;: [&#x27;gini&#x27;, &#x27;entropy&#x27;],\n",
       "                         &#x27;max_features&#x27;: [1, 2, 3, 4],\n",
       "                         &#x27;n_estimators&#x27;: [5, 10, 15, 20, 30, 50]},\n",
       "             scoring=&#x27;accuracy&#x27;)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item sk-dashed-wrapped\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-66\" type=\"checkbox\" ><label for=\"sk-estimator-id-66\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;&nbsp;GridSearchCV<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.model_selection.GridSearchCV.html\">?<span>Documentation for GridSearchCV</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>GridSearchCV(cv=5, estimator=RandomForestClassifier(n_estimators=50),\n",
       "             param_grid={&#x27;criterion&#x27;: [&#x27;gini&#x27;, &#x27;entropy&#x27;],\n",
       "                         &#x27;max_features&#x27;: [1, 2, 3, 4],\n",
       "                         &#x27;n_estimators&#x27;: [5, 10, 15, 20, 30, 50]},\n",
       "             scoring=&#x27;accuracy&#x27;)</pre></div> </div></div><div class=\"sk-parallel\"><div class=\"sk-parallel-item\"><div class=\"sk-item\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-67\" type=\"checkbox\" ><label for=\"sk-estimator-id-67\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">estimator: RandomForestClassifier</label><div class=\"sk-toggleable__content fitted\"><pre>RandomForestClassifier(n_estimators=50)</pre></div> </div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-68\" type=\"checkbox\" ><label for=\"sk-estimator-id-68\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;RandomForestClassifier<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.ensemble.RandomForestClassifier.html\">?<span>Documentation for RandomForestClassifier</span></a></label><div class=\"sk-toggleable__content fitted\"><pre>RandomForestClassifier(n_estimators=50)</pre></div> </div></div></div></div></div></div></div></div></div>"
      ],
      "text/plain": [
       "GridSearchCV(cv=5, estimator=RandomForestClassifier(n_estimators=50),\n",
       "             param_grid={'criterion': ['gini', 'entropy'],\n",
       "                         'max_features': [1, 2, 3, 4],\n",
       "                         'n_estimators': [5, 10, 15, 20, 30, 50]},\n",
       "             scoring='accuracy')"
      ]
     },
     "execution_count": 256,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-55 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: black;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-55 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-55 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-55 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-55 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-55 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-55 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-55 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-55 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-55 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-55 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-55 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-55 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-55 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-55 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-55 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "#sk-container-id-55 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-55 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-55 div.sk-toggleable__content {\n",
       "  max-height: 0;\n",
       "  max-width: 0;\n",
       "  overflow: hidden;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-55 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-55 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-55 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-55 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  max-height: 200px;\n",
       "  max-width: 100%;\n",
       "  overflow: auto;\n",
       "}\n",
       "\n",
       "#sk-container-id-55 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-55 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-55 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-55 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-55 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-55 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-55 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-55 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-55 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-55 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-55 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-55 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-55 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-55 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-55 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 1ex;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-55 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-55 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-55 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-55 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "</style><div id=\"sk-container-id-55\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>RandomForestClassifier(max_features=2, n_estimators=50)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-69\" type=\"checkbox\" checked><label for=\"sk-estimator-id-69\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;&nbsp;RandomForestClassifier<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.ensemble.RandomForestClassifier.html\">?<span>Documentation for RandomForestClassifier</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>RandomForestClassifier(max_features=2, n_estimators=50)</pre></div> </div></div></div></div>"
      ],
      "text/plain": [
       "RandomForestClassifier(max_features=2, n_estimators=50)"
      ]
     },
     "execution_count": 256,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": [
       "0.9102040816326531"
      ]
     },
     "execution_count": 256,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": [
       "{'criterion': 'gini', 'max_features': 2, 'n_estimators': 50}"
      ]
     },
     "execution_count": 256,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "parameters = {\n",
    "    'n_estimators':[5,10,15,20,30,50],\n",
    "    'max_features':[1,2,3,4],\n",
    "    'criterion':['gini','entropy']\n",
    "}\n",
    "\n",
    "rf_search = GridSearchCV(rf, parameters, scoring='accuracy', cv=5)\n",
    "rf_search.fit(X_train, y_train)\n",
    "\n",
    "#查看最佳结果\n",
    "rf_search.best_estimator_\n",
    "rf_search.best_score_\n",
    "rf_search.best_params_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 257,
   "id": "b9835067-4e0f-4119-9177-e4d2ccc96003",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "              precision    recall  f1-score   support\n",
      "\n",
      "           A       0.90      0.73      0.81        26\n",
      "           B       0.94      0.88      0.91        34\n",
      "           F       0.84      0.87      0.86        31\n",
      "           G       0.92      0.94      0.93        35\n",
      "           K       0.83      0.89      0.86        27\n",
      "           M       0.96      0.96      0.96        27\n",
      "           O       0.85      0.93      0.89        30\n",
      "\n",
      "    accuracy                           0.89       210\n",
      "   macro avg       0.89      0.89      0.89       210\n",
      "weighted avg       0.89      0.89      0.89       210\n",
      "\n",
      "[[19  1  3  0  0  0  3]\n",
      " [ 2 30  1  0  0  0  1]\n",
      " [ 0  1 27  2  0  0  1]\n",
      " [ 0  0  0 33  2  0  0]\n",
      " [ 0  0  1  1 24  1  0]\n",
      " [ 0  0  0  0  1 26  0]\n",
      " [ 0  0  0  0  2  0 28]]\n"
     ]
    }
   ],
   "source": [
    "# 利用模型对测试集进行预测，输出target预测标签值和概率\n",
    "y_test_pred = rf.predict(X_test)\n",
    "y_test_prob = rf.predict_proba(X_test)\n",
    "\n",
    "# 分类评估汇总报告classification_report\n",
    "print(classification_report(y_test,y_test_pred))\n",
    "\n",
    "# 误分类矩阵 confusion_matrix\n",
    "print(confusion_matrix(y_test,y_test_pred))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c106e442-3e86-45b8-972d-af31a31616a6",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
